/*
 * Engine Alpha ist eine anfängerorientierte 2D-Gaming Engine.
 *
 * Copyright (c) 2011 - 2014 Michael Andonie and contributors.
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 */

package ea;

/**
 * Basisklasse fuer ein regelmaessiges n-Eck.<br /> Tatsaechlich ist aufgrund von moeglicherweise
 * Auftretenden Rundungsfehlern dies ein n+1 - Eck.<br /> Dies faellt jedoch nicht auf und ist nur
 * da um eventuell auftretende Abrundungsfehler wieder auszuduennen.
 *
 * @author Michael Andonie
 */
@SuppressWarnings ("serial")
public class RegEck extends Geometrie {
	/**
	 * Die Anzahl an Ecken.<br /> Es kann keine Form mit weniger als 3 Ecken geben!
	 */
	protected final int eckenzahl;

	/**
	 * Der Radius des Umkreises des n-Ecks
	 */
	protected float radius;

	/**
	 * Konstruktor fuer Objekte der Klasse N-Eck
	 *
	 * @param x
	 * 		Die X-Koordinate der Linken oberen Ecke des das n-Eck umschreibenden Rechtecks, <b>nicht
	 * 		die des Mittelpunktes</b>
	 * @param y
	 * 		Die Y-Koordinate der Linken oberen Ecke des das n-Eck umschreibenden Rechtecks, <b>nicht
	 * 		die des Mittelpunktes</b>
	 * @param ecken
	 * 		Die Anzahl der Ecken des Ecks
	 * @param durchmesser
	 * 		Der Durchmesser des Kreises, der das n-Eck umschreibt
	 */
	public RegEck (float x, float y, int ecken, float durchmesser) {
		super(x, y);
		eckenzahl = ecken;
		this.radius = durchmesser / 2;
		aktualisierenFirst();
	}

	/**
	 * Setzt einen neuen Durchmesser fuer das regelmaessige n-Eck.
	 *
	 * @param durchmesser
	 * 		Der neue Durchmesser
	 */
	public void durchmesserSetzen (int durchmesser) {
		this.radius = durchmesser / 2;
		aktualisieren();
	}

	/**
	 * Setzt einen neuen Radius fuer das regelmaessige n-Eck.
	 *
	 * @param radius
	 * 		Der neue Radius.
	 */
	public void radiusSetzen (int radius) {
		this.radius = radius;
		aktualisieren();
	}

	/**
	 * In dieser Methode werden saemtliche Dreiecke neu berechnet und die Referenz bei Aufruf in der
	 * Superklasse hierauf gesetzt.<br /> Hierbei wird ein Dreieck mehr zurueckgegeben als Ecken
	 * eingegeben wurden, um das Eck auch schliessen zu koennen. Dies ist aufgrund des rundens
	 * innerhalb des Algorythmusses nicht garantiert.
	 */
	public Dreieck[] neuBerechnen () {
		Dreieck[] ret = new Dreieck[eckenzahl + 1];
		double winkelSchritt = (360 / eckenzahl) * (Math.PI / 180);
		double winkel = 0;
		float x = position.x + (radius);
		float y = position.y + (radius);
		final Punkt zentrum = new Punkt(x + (radius / 2), y + (radius / 2));
		Punkt letzter = new Punkt((float) ((Math.sin(winkel + (Math.PI / 2)) * radius)) + x, (float) ((Math.sin(winkel) * radius)) + y);
		final Punkt erster = letzter;
		for (int i = 0; i < ret.length - 1; i++) {
			winkel += winkelSchritt;
			float koordX = (float) ((Math.sin(winkel + (Math.PI / 2)) * radius)) + x;
			float koordY = (float) ((Math.sin(winkel) * radius)) + y;
			Punkt neuer = new Punkt(koordX, koordY);
			ret[i] = new Dreieck(zentrum, letzter, neuer);
			letzter = neuer;
		}
		ret[ret.length - 1] = new Dreieck(zentrum, letzter, erster);
		return ret;
	}
}
